package sort.helper;

import sort.bublesort.BubbleSort;
import sort.heapsort.HeapSort;
import sort.insertsort.InsertSort;
import sort.mergesort.MergeSort;
import sort.quicksort.QuickSort;
import sort.selectionsort.SelectionSort;
import sort.shellsort.ShellSort;

/**
 * @author XY
 * @version 1.0
 * @date 2021/8/16 17:27
 * @Description 验证数组是否有序
 */
public class SortingHelper {

    private SortingHelper(){};

    public static <E extends Comparable<E>> boolean isSorted(E[] arr){
        for(int i=1;i<arr.length;i++){
            if(arr[i-1].compareTo(arr[i])>0){
                return false;
            }
        }
        return true;
    }

    /**
     * @param sortName 排序算法方法名
     * @param arr
     * @author XY
     * @date 2021/8/16 17:31
     * @Description  测试排序算法
     */
    public static <E extends Comparable<E>> void sortTest(String sortName,E[] arr){
        long start=System.nanoTime();
        switch (sortName){
            case "SelectionSort":
                SelectionSort.selectionSort(arr);
                break;
            case "InsertSort":
                InsertSort.insertSort(arr);
                break;
            case "InsertSortBetter":
                InsertSort.insertSortBetter(arr);
                break;
            case "MergeSort":
                MergeSort.sort(arr);
                break;
            case "MergeSort2":
                MergeSort.sort2(arr);
                break;
            case "QuickSort":
                QuickSort.sort(arr);
                break;
            case "QuickSort2":
                QuickSort.sort2ways(arr);
                break;
            case "QuickSort3":
                QuickSort.sort3ways(arr);
                break;
            case "HeapSort":
                HeapSort.sort(arr);
                break;
            case "BubbleSort":
                BubbleSort.sort(arr);
                break;
            case "BubbleSort2":
                BubbleSort.sort2(arr);
                break;
            case "ShellSort":
                ShellSort.sort(arr);
                break;
            default:break;
        }
        long end=System.nanoTime();
        double time =(end-start)/1000000000.0;
        if(!SortingHelper.isSorted(arr)){
            throw new RuntimeException("排序失败");
        }
        System.out.println(String.format("%s, n=%d : %f s",sortName,arr.length,time));

    }
}
